/**  
 * @Title: CardSvcImpl.java
 * @Package com.atm.service.impl
 * @author 姜向阳
 * @date 2018年3月14日
 * @version V1.0  
 */
package com.atm.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.atm.constants.Constants;
import com.atm.entity.Bill;
import com.atm.entity.Card;
import com.atm.service.CardSvc;
import com.atm.util.DataOperateUtil;
import com.atm.util.DateFormatUtil;
import com.atm.util.ValidateDataUtil;

/**
 * @ClassName: CardSvcImpl
 * @Description: 银行卡服务实现类
 * @author 姜向阳
 * @date 2018年3月14日
 * @since JDK 1.8
 */
public abstract class CardSvcImpl implements CardSvc {

	/*
	 * (非 Javadoc)
	 * 
	 * 
	 * @param card
	 * 
	 * @return
	 * 
	 * @see com.atm.service.CardSvc#createCard(com.atm.entity.Card)
	 */
	@Override
	public Map<String, Object> createCard(Card card) {

		Map<String, Object> resultMap = new HashMap<String, Object>();

		// 卡号不合法
		ValidateDataUtil validateDataUtil = ValidateDataUtil.getValidateDataUtil();
		boolean result = validateDataUtil.validateCardID(card.getCardID());

		if (!result) {

			resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_ERR_CARDID);
			return resultMap;
		}

		// 密码不合法
		result = validateDataUtil.validatePassword(card.getPassword());
		if (!result) {

			resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_ERR_PASSWORD);
			return resultMap;
		}

		//验证用户名不能为null或空串
		if(card.getUsername()==null||card.getUsername().trim().equals("")) {
			resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_ERR_USERNAME);
			return resultMap;
		}
		
		// 默认账户余额为0
		card.setAccountBalance("0");
		
		// 设置账单集合
		List<Bill> bills = new ArrayList<Bill>();
		card.setBills(bills);

		// 保存银行卡账户数据
		DataOperateUtil dataOperateUtil = DataOperateUtil.getDataOperateUtil();
		String operateResult = dataOperateUtil.writeCardData(card);

		// 返回消息
		resultMap.put(Constants.RESULT_KEY_CODE, operateResult);
		// 操作成功返回卡对象
		if (operateResult.equals(Constants.MSG_SUCCESS)) {
			resultMap.put(Constants.RESULT_KEY_DATA, card);
		}
		return resultMap;
	}

	/*
	 * (非 Javadoc)
	 * 
	 * 
	 * @param cardID
	 * 
	 * @param password
	 * 
	 * @return
	 * 
	 * @see com.atm.service.CardSvc#validateCard(java.lang.String, java.lang.String)
	 */
	@Override
	public Map<String, Object> validateCard(String cardID, String password) {

		Map<String, Object> resultMap = new HashMap<String, Object>();

		// 卡号不合法
		ValidateDataUtil validateDataUtil = ValidateDataUtil.getValidateDataUtil();
		boolean result = validateDataUtil.validateCardID(cardID);

		if (!result) {

			resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_ERR_CARDID);
			return resultMap;
		}

		// 密码不合法
		result = validateDataUtil.validatePassword(password);
		if (!result) {

			resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_ERR_PASSWORD);
			return resultMap;
		}

		DataOperateUtil dataOperateUtil = DataOperateUtil.getDataOperateUtil();
		Card card = dataOperateUtil.readCardData(cardID);

		// 为空说明没有当前卡号的银行卡
		if (card == null) {

			resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_ERR_CARDID);
			return resultMap;
		}

		// 不为空但密码不相同说明当前卡号银行卡存在但密码错误
		if (!card.getPassword().equals(password)) {

			resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_ERR_PASSWORD);
			return resultMap;
		}

		// 卡号存在且密码正确返回当前银行卡card对象
		resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_SUCCESS);
		resultMap.put(Constants.RESULT_KEY_DATA, card);
		return resultMap;
	}

	/*
	 * (非 Javadoc)
	 * 
	 * 
	 * @param cardID
	 * 
	 * @return
	 * 
	 * @see com.atm.service.CardSvc#readData(java.lang.String)
	 */
	@Override
	public Map<String, Object> readData(String cardID) {

		Map<String, Object> resultMap = new HashMap<String, Object>();

		// 卡号不合法
		ValidateDataUtil validateDataUtil = ValidateDataUtil.getValidateDataUtil();
		boolean result = validateDataUtil.validateCardID(cardID);
		
		if (!result) {

			resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_ERR_CARDID);
			return resultMap;
		}
		
		DataOperateUtil dataOperateUtil = DataOperateUtil.getDataOperateUtil();
		Card card = dataOperateUtil.readCardData(cardID);
		
		//为空说明没有当前卡号的银行卡
		if (card == null) {
			resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_ERR_GET_DATA);
			return resultMap;
		}

		resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_SUCCESS);
		resultMap.put(Constants.RESULT_KEY_DATA, card);

		return resultMap;
	}

	/*
	 * (非 Javadoc)
	 * 
	 * 
	 * @param cardID
	 * 
	 * @param money
	 * 
	 * @return
	 * 
	 * @see com.atm.service.CardSvc#saveMoney(java.lang.String, java.lang.String)
	 */
	@Override
	public Map<String, Object> saveMoney(String cardID, String money) {

		Map<String, Object> resultMap = new HashMap<String, Object>();

		// 卡号不合法
		ValidateDataUtil validateDataUtil = ValidateDataUtil.getValidateDataUtil();
		boolean result = validateDataUtil.validateCardID(cardID);
				
		if (!result) {

			resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_ERR_CARDID);
			return resultMap;
		}
				
		DataOperateUtil dataOperateUtil = DataOperateUtil.getDataOperateUtil();
		Card card = dataOperateUtil.readCardData(cardID);
		
		//为空说明没有当前卡号的银行卡
		if (card == null) {
			resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_ERR_GET_DATA);
			return resultMap;
		}

		double accountBalance = Double.parseDouble(card.getAccountBalance());
		double saveMoney = Double.parseDouble(money);
		card.setAccountBalance(accountBalance + saveMoney + "");
		
		Bill bill = new Bill();
		bill.setAffairType(Constants.CARD_OPERATE_SAVE_TYPE);
		bill.setCardID(card.getCardID());
		bill.setTradeBalance(money);
		DateFormatUtil dateFormatUtil = DateFormatUtil.getDateFormatUtil();
		bill.setTradeTime(dateFormatUtil.formatStrByDate(new Date()));
		List<Bill> bills = card.getBills();
		bills.add(bill);
		card.setBills(bills);

		// 保存银行卡账户数据
		String operateResult = dataOperateUtil.writeCardData(card);

		// 返回消息
		resultMap.put(Constants.RESULT_KEY_CODE, operateResult);
		// 操作成功返回卡对象
		if (operateResult.equals(Constants.MSG_SUCCESS)) {
			resultMap.put(Constants.RESULT_KEY_DATA, card);
		}
		return resultMap;
	}

	/*
	 * (非 Javadoc)
	 * 
	 * 
	 * @param cardID
	 * 
	 * @param password
	 * 
	 * @return
	 * 
	 * @see com.atm.service.CardSvc#updatePassword(java.lang.String,
	 * java.lang.String)
	 */
	@Override
	public Map<String, Object> updatePassword(String cardID, String password) {
		
		Map<String, Object> resultMap = new HashMap<String, Object>();
		
		// 卡号不合法
		ValidateDataUtil validateDataUtil = ValidateDataUtil.getValidateDataUtil();
		boolean result = validateDataUtil.validateCardID(cardID);

		if (!result) {

			resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_ERR_CARDID);
			return resultMap;
		}

		// 密码不合法
		result = validateDataUtil.validatePassword(password);
		if (!result) {

			resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_ERR_PASSWORD);
			return resultMap;
		}

		DataOperateUtil dataOperateUtil = DataOperateUtil.getDataOperateUtil();
		Card card = dataOperateUtil.readCardData(cardID);
		
		//为空说明没有当前卡号的银行卡
		if (card == null) {
			resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_ERR_GET_DATA);
			return resultMap;
		}
		
		card.setPassword(password);
		String msgResult = dataOperateUtil.writeCardData(card);
		if(msgResult.equals(Constants.MSG_ERR_SAVE_DATA)) {
			resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_ERR_SAVE_DATA);
			return resultMap;
		}
		resultMap.put(Constants.RESULT_KEY_CODE, Constants.MSG_SUCCESS);
		resultMap.put(Constants.RESULT_KEY_DATA, card);
		return resultMap;
	}
}
